約 3,975,485 件
https://w.atwiki.jp/vst_prog/pages/70.html
VST Tips(準備中) 最小構成のVST ここでは最小構成のVSTを作成する方法について記載する。 最小構成のVSTを作成するには以下の2点を行えば、VSTとして読み込めるものが完成する。 AudioEffectXクラスを継承した自作クラスの作成 自分で作ったVSTクラスを呼び出すAudioEffect* createEffectInstance()関数の作成 なお、ここで作成するVSTサンプルのソースコード全体はここにある。 AudioEffectXクラスを継承した自作VST用クラスの作成 まず基本として、VSTはAudioEffectXクラスを継承して作らなければならない。 AudioEffectXクラスは「vstsdk2.4\public.sdk\source\vst2.x\audioeffectx.h」で定義されている。 AudioEffectXクラスを継承して作った自作クラスは、以下の2つの関数を持たなければならない。 コンストラクタ …自作VSTの初期化を行う。初期化にはルールがある(後述)。 void processReplacing() …音声の処理を行う関数。AudioEffectXクラスから継承する。 具体的には以下のようになる。 // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMinimumVST public AudioEffectX{public MyMinimumVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; AudioEffect* createEffectInstance()関数の作成 次に、ホストアプリケーション(Cubase,Sonar等)が自作VSTのインスタンスを作成するために必要な関数を作成しなければならない。 なぜこのような関数が必要かの詳細は説明できるほどの知識がないため省略する。(どうもDLLファイルはC++のクラスをエクスポートできないらしい。苦肉の策としてこのような関数がある模様。) 自作VSTのインスタンスをnewで生成してreturnで返すだけでよい。 // ============================================================================================// 自作VSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMinimumVST (audioMaster);} 自作VSTクラスの初期化方法、音声処理部分の説明については次項で説明する。 次へ 同一カテゴリのTips 項目 No. 概要 最小構成のVST No.1 最小構成の自作VSTに必要な関数等の説明。 No.2 最小構成の自作VSTの必須初期化項目について No.3 最小構成の自作VSTの音声処理関数について No.4 最小構成の自作VSTのサンプルソースコード全体
https://w.atwiki.jp/vst_prog/pages/80.html
トップページ MIDIメッセージを処理するVSTについて2 MIDIメッセージ処理 No1~No5で作成したVSTのMIDI処理については、どんなVSTでもほぼ共通の処理となる。 コードを再利用しやすいように、ここではシステムエクスクルーシブを除くMIDIメッセージに関する処理をクラスとしてひとまとめにする。 MIDIメッセージを処理するクラスは自作VSTクラスで下記のように継承できるように作成する。 class MyMidiSampleVST2 public AudioEffectX , public CMidiMsg // CMidiMsgが今回作成するクラス{: // 以下省略:}; ここで作成するVSTサンプルのソースコード全体はここにある。 MIDIメッセージ処理用クラス定義 MIDIメッセージ処理用クラスは以下のように定義する。(全体は長いので一部省略している。全体はここにある。) class CMidiMsg{protected int cur; //読み込み中のMIDIの位置int num; //受け取ったMIDIメッセージの数MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファpublic CMidiMsg(void);~CMidiMsg(void); // バッファのクリア等を行う。virtual void clearMidiMsg(); // MIDIメッセージをバッファに追加する// バッファへの追加が成功すると1、失敗すると0を返すvirtual int addMidiMsg(VstMidiEvent *midievent);virtual int addMidiMsg(MidiMessage msg); // バッファからMIDIメッセージを取り出すvirtual MidiMessage getMidiMsg(); // バッファ中にあるMIDIメッセージの数を返すvirtual VstInt32 getMidiMessageNum(); // バッファから最初に取り出せるMIDIメッセージのDeltaFramesを返すvirtual VstInt32 getNextDeltaFrames(); // MIDIメッセージが何かを判断し、そのメッセージに対応した// onMidiKeyOn()関数、onMidiControlChange()関数等を呼び出す。// 引数なしの場合、内部でgetMidiMsg()が使用されるので注意。virtual void midiProc(MidiMessage mididata);virtual void midiProc() { MidiMessage mididata = getMidiMsg(); midiProc(mididata); }; // midiProc()関数から呼び出される。// それぞれのMIDIメッセージに応じて処理を行う// 以下6つはオーバーライドして使うvirtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空: // 長いので省略:}; 解説 まず、MIDIメッセージのや書き込みのためのバッファと読み出し位置や書き込み位置の変数を定義している。 これらは他のクラスから読み込まれることはないのでprotectedで宣言している。 protected int cur; //読み込み中のMIDIの位置 int num; //受け取ったMIDIメッセージの数 MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ 次に以下2つの操作を行うための関数を定義している ホストアプリケーションからのMIDIメッセージの受け取る際に使用する関数(processEvents()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 clearMidiMsg() なし なし MIDIメッセージを受け取るMIDIバッファを初期化する関数。 addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)MIDIバッファへの追加に成功すると1、失敗すると0が返る。 受け取ったMIDIメッセージを処理する関数(processReplacing()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 getMidiMessageNum() VstInt32 なし MIDIメッセージ有無のチェックに利用する関数。戻り値はMIDIバッファにあるMIDIメッセージの数。 getNextDeltaFrames() VstInt32 なし processReplacing()関数内で次のMIDIメッセージを処理するタイミングを返す関数。戻り値は処理すべきフレーム(0~sampleFramesの範囲の値) getMidiMsg() MidiMessage MIDIバッファからのMIDIメッセージの取り出す関数。戻り値はMIDIメッセージ構造体 midiProc()関数 なし MidiMessage mididata 引数のMIDIメッセージに応じて処理を実施する。引数は処理するMIDIメッセージ midiProc()関数では各MIDIメッセージ(KeyOn、KeyOff、ControlChange等)を処理するメンバ関数を呼び出す。 これらの関数(onMidiKeyOn()関数、onMidiKeyOff()関数 等)についても、定義している。 midiProc()関数から呼び出されるメンバ関数 メンバ関数 戻り値 引数 内容 onMidiKeyOn() なし MIDIメッセージがKeyOnの際に呼び出される。 onMidiKeyOff() なし MIDIメッセージがKeyOffの際に呼び出される。 onMidiProgramChange() なし MIDIメッセージがプログラムチェンジの際に呼び出される。 onMidiPoliKeyPress() なし MIDIメッセージがポリフォニックキープレッシャーの際に呼び出される。 onMidiChannelPress() なし MIDIメッセージがチャンネルプレッシャーの際に呼び出される。 onMidiPitchBend() なし MIDIメッセージがピッチベンドチェンジの際に呼び出される。 onMidiSystemMessage() なし MIDIメッセージがシステムコモンメッセージ、システムリアルタイムメッセージの際に呼び出される。システムメッセージに応じてさらにonMidiQuarterFrame()関数、onMidiSongPointer()関数などが呼び出される onMidiControlChange() なし MIDIメッセージがコントロールチェンジの際に呼び出される。コントロールチェンジメッセージに応じてさらにonMidiCC000()~onMidiCC127()の関数が呼び出される。 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/84.html
VST Tips(準備中) 簡単な音源(VSTi)の作成(暫定版) (2011/4/14更新) 【注意】 本サンプルはSynthesizerの基本的な処理を追いやすくするために書かれたコードです。以下の点が大きなバグとして残っておりますのでご注意ください。(小さなバグも多数あります) ノートOFF時に振幅が急激に変化するため、不快なノイズが入ります。(基本的には問題ないと思いますが大きな音量の場合、耳やスピーカーを痛める可能性があります。) なお、本サンプル利用を使用したことによって生じたすべての障害・損害・不具合等に関しては、一切の責任を負いません。各自の責任においてご使用ください。 サンプルコード全体 ソースコードのダウンロード→ ここをクリック (dllファイルも同梱しております。dllファイルのウィルスチェックはしておりませんのでdllファイル利用の前には必ずチェックをお願いいたします。) MIDIの処理部分についてはこちらの【CMidiMsg.h】と【CMidiMsg.cpp】をご覧ください。 【MySynthSampleVST.h】 // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include "audioeffectx.h" #include "CMidiMsg.h"#include "CVoice.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 #define MAX_OSCILLATORS 8 // オシレータの数(最大発音数)// ============================================================================================// VSTの基本となるクラス// ============================================================================================class MySynthSampleVST public AudioEffectX , public CMidiMsg{protected CVoice osc[MAX_OSCILLATORS];public MySynthSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);virtual void processReplacing2 (float* inL, float* inR, float* outL, float* outR, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events); virtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo);virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo);}; // ============================================================================================// このVSTを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MySynthSampleVST (audioMaster);} // ============================================================================================// このVSTの初期化// ============================================================================================MySynthSampleVST MySynthSampleVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う} // ============================================================================================// 音声信号処理部分// ============================================================================================void MySynthSampleVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* inL = inputs[0]; //入力 左用float* inR = inputs[1]; //入力 右用float* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 // 処理されたフレーム数VstInt32 processedFrames = 0; while(getMidiMessageNum() 0){// 処理すべきフレーム数VstInt32 Frames = getNextDeltaFrames() - processedFrames;processReplacing2 (inL, inR, outL, outR, Frames); // MIDIメッセージの処理を行うmidiProc(); // 処理されたフレーム数を計算// 同時に音声信号バッファのポインタについても進める。processedFrames += Frames;inL += Frames;inR += Frames;outL += Frames;outR += Frames;} processReplacing2 (inL, inR, outL, outR, sampleFrames - processedFrames);} void MySynthSampleVST processReplacing2 (float* inL, float* inR, float* outL, float* outR, VstInt32 sampleFrames){for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。float out = 0.0f;float volume = 1.0 / (double)MAX_OSCILLATORS; // 各オシレータの振幅を取得し、出力に足し合わせる。for(int j = 0; j MAX_OSCILLATORS; j++){// オシレータの振幅を取得。out += osc[j].amplitude(); // オシレータの状態を更新する。osc[j].update();} //出力バッファへ書き込む。outL[i] = out * volume;outR[i] = out * volume;}} // MIDIメッセージをVSTに保存する。// processReplacing()の前に必ず1度だけ呼び出される。VstInt32 MySynthSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。clearMidiMsg(); int loops = (events- numEvents); // VSTイベントの回数だけループをまわす。for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]);if( !addMidiMsg(midievent) ){break;}}} // 1を返さなければならないreturn 1;} // ============================================================================================// MIDIメッセージを処理する// ============================================================================================void MySynthSampleVST onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo){// OFF状態のオシレータを探すfor(int i = 0; i MAX_OSCILLATORS; i++){if(osc[i].getStatus() == VOICE_STATE_OFF){// OFF状態のオシレータをONにして検索終了osc[i].start(noteNo);break;}}} void MySynthSampleVST onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo){// ON状態でかつノートNoと一致するオシレータを探すfor(int i = 0; i MAX_OSCILLATORS; i++){if(osc[i].getStatus() == VOICE_STATE_ON osc[i].getNoteNo() == noteNo){// ON状態のオシレータをOFFにして検索終了osc[i].stop();break;}}} 【COscillator.h】 #pragma once#include math.h #define VOICE_STATE_OFF 0#define VOICE_STATE_ON 1 class CVoice{protected float elapsedFrames; //オシレータが発音を始めてから経過したフレーム数 int status; //オシレータ発音中の場合はTrueint noteNo; //オシレータの音程 float sampleRate; //サンプルレート(デフォルト 44100) public inline CVoice(void);inline ~CVoice(void); // オシレータを初期化するメンバー関数inline void init(); // 現在のオシレータの振幅を返すメンバー関数inline float amplitude(); // オシレータの状態を更新するメンバー関数inline void update(); // オシレータの動作を開始・停止させるメンバー関数inline void start(int note);inline void stop(); // オシレータのメンバ変数を設定するメンバー関数inline void setSampleRate(float newSampleRate); // オシレータの状態を取得するメンバー関数inline int getStatus() { return status; };inline int getNoteNo() { return noteNo; }; }; CVoice CVoice(){// 初期化を実施init();} CVoice ~CVoice(){} void CVoice init(){// メンバ変数を初期化するelapsedFrames = 0.0;status = VOICE_STATE_OFF;noteNo = 0;sampleRate =44100.0f;} float CVoice amplitude(){// オシレータの振幅を返すif(status == VOICE_STATE_ON){// オシレータの状態がONの時float pi = 3.14159265f; // ノートNoから周波数を計算するfloat freq = (float)(440.0 * pow(2.0, ((double)noteNo - 69.0)/12.0));; // 現在の振幅量を返すreturn (float)sin(2.0 * pi * freq * elapsedFrames / sampleRate);}else{// オシレータの状態がOFFの時 // 0を返すreturn 0.0f;}} void CVoice update(){// 経過時間を進めるelapsedFrames += 1.0f;} void CVoice start(int note){status = VOICE_STATE_ON;noteNo = note;} void CVoice stop(){init();} void CVoice setSampleRate(float newSampleRate){sampleRate = newSampleRate;} VST Tipsトップページへ(準備中) 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/talesofdic/pages/20370.html
術・技:アリス・シンセシス・サーティ レイズ レイズ 上へ 術・技:アリス・シンセシス・サーティ(TOtR)を編集
https://w.atwiki.jp/vst_prog/pages/55.html
VST Tips(準備中) VC++ プロジェクトの作成 ここではVC++でVST用のプロジェクトを作成する方法については記載する。 Visual C++ プロジェクト作成ウィザードの起動 Visual C++を起動し、メニューから「ファイル」→「新規作成」→「プロジェクト」を選択する。 プロジェクト作成ウィザードが起動する。 プロジェクト種別、プロジェクト名の入力 開いたダイアログのテンプレートから「Win32 プロジェクト」を選択。 ダイアログ下側の「プロジェクト名」に今回作成するプロジェクトの名前を入力し、「OK」を押す。 プロジェクト種別の確認 現在のプロジェクト設定が「Windowsアプリケーション」となっていることを確認し、「次へ」を押す アプリケーションの設定 アプリケーションの種類で「DLL」を選択。追加オプションとして「空のプロジェクト」を選択して完了を押す。 完了を押すとプロジェクトが作成される。 次へ 同一カテゴリのTips 項目 No. 概要 VC++ プロジェクトの準備 No.1 VC++でVST用のプロジェクトを作成する No.2 VSTを作成するに当たって必要なVST SDKファイルをVC++のプロジェクトに追加する No.3 VSTを作成するに当たって必要なvstplug.defファイルを作成する No.4 VSTを作成するに当たって必要なコンパイラ、リンカ設定を追加する No.5 VSTをコンパイルするの際の注意事項
https://w.atwiki.jp/vst_prog/pages/73.html
VST Tips(準備中) 最小構成のVST 最小構成のVSTのサンプルである。 エフェクターとしてロード可能で、入力をそのまま出力する。 サンプルコード全体 ソースコードのダウンロード→ここをクリック // ============================================================================================// インクルードファイル// ============================================================================================#include "audioeffectx.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMinimumVST public AudioEffectX{public MyMinimumVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMinimumVST (audioMaster);} MyMinimumVST MyMinimumVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う } void MyMinimumVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* inL = inputs[0]; //入力 左用float* inR = inputs[1]; //入力 右用float* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 //出力バッファへ書き込む。outL[i] = inL[i];outR[i] = inR[i];}} VST Tipsトップページへ(準備中) 同一カテゴリのTips 項目 No. 概要 最小構成のVST No.1 最小構成の自作VSTに必要な関数等の説明。 No.2 最小構成の自作VSTの必須初期化項目について No.3 最小構成の自作VSTの音声処理関数について No.4 最小構成の自作VSTのサンプルソースコード全体
https://w.atwiki.jp/vst_prog/pages/86.html
VST Tips(準備中) 簡単な音源(VSTi)の仕様 ここで作成する音源(VSTi)は前項で説明したシンセサイザーの構成から大幅に機能を削減した簡易なものとする。 今回作成する音源(VSTi)の仕様は下記のとおりである。 機能 対応内容 最大同時発音数 8 波形 正弦波のみ フィルタ、エンベロープジェネレータ、LFO なし 操作可能なパラメーター なし その他 ピッチベンド、モジュレーションホイール未対応 また今回作成する音源は下記の構成をとっている。 簡単な音源(VSTi)で処理すべき内容の概要 今回の音源(VSTi)で処理すべき内容の概要については以下のとおりである。 項目 処理内容 MIDIメッセージを受け取る Midiメッセージを受け取り、processReplacing()関数内で処理できるようにする。 MIDIメッセージにあわせてVoiceをOn/Offする Note Onの場合→停止中のVoiceを探して、発音させる。Note Offの場合→Note OffのNoteNo.と同じNoteNo.で発音中のVoiceを停止させる。その他のMidiメッセージ→無視する Voiceの出力を足し合わせて出力バッファに書き込む processReplacing()関数内でVoiceの出力を合計して出力バッファに書き込む Voiceの作成 上記3つの機能に対応したVoiceクラスを作成する それぞれの実装方法 構成図の各部位は以下のようにして実装する。 部位 実装方法 Voice CVoiceクラスを作成 Oscillator Voiceクラス内に直接記述 MIDI Controller CMidiMsgクラスを継承して実装 Voice Controller AudioEffectXクラスを継承したクラスに直接記述 Mixer AudioEffectXクラスを継承したクラスに直接記述 次へ 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vst_prog/pages/41.html
VST(エフェクター)作成例 VSTの初期化 createEffectInstanceの記述 ホストアプリケーション(Cubase、Sonar等)が今回作成するVST(クラスの宣言でAudioEffectXを継承したクラス)のインスタンスを作成ために必要な関数。 なぜこのような関数が必要かの詳細は説明できるほどの知識がないため省略する。(どうもDLLファイルはC++のクラスをエクスポートできないらしい。苦肉の策としてこのような関数がある模様。) とりあえず、今回作成するVSTのインスタンスをnewで生成してreturnで返すとよい。 // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyTremoloVST (audioMaster);} VSTの初期化 VSTの初期化はコンストラクタで行わなければならない。 サンプルエフェクターのコンストラクタは以下のようにしている。 MyTremoloVST MyTremoloVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //このVSTのパラメータを初期化する。fTime = 0.0f; fTremoloSpeed = 1.0f / 4.0f; //トレモロの周期 0.25秒fTremoloDepth = 0.5f; //トレモロの振幅 0.5倍} VSTの初期化では初めにコンストラクタでは継承元であるAudioEffectXのコンストラクタを呼び出し、audioMasterCallbackとプリセット数とパラメーター数を設定しなければならない。(2行目) AudioEffectX(audioMasterCallback audioMaster, VstInt32 numPrograms, VstInt32 numParams) audioMasterCallbackは作成するVSTの引数をそのまま渡せばよい。プリセット数とパラメーター数は作成するVSTにあわせて値を設定する。 サンプルエフェクターでは以下のとおりとしている 引数 値 audioMasterCallback audioMaster audioMaster VstInt32 numPrograms MY_VST_PRESET_NUM((宣言部で定義済み。1) VstInt32 numParams MY_VST_PARAMETER_NUM((宣言部で定義済み。2) 次に以下の関数を呼び出して、音声の入力数や出力数、ユニークID等の情報を設定している。(8~16行目) なお、以下の関数に関しては必ず呼び出さなければならず、また設定した情報はプログラムが終了するまで変更してはならない。 関数名 戻り値 引数 概要 setNumInputs なし VstInt32 inputs エフェクターの入力数の情報を設定する。サンプルエフェクターではMY_VST_INPUT_NUM(宣言部で定義済み。2)としている。 setNumOutputs なし VstInt32 outputs エフェクターの出力数の情報を設定する。サンプルエフェクターではMY_VST_OUTPUT_NUM(宣言部で定義済み。2)としている。 setUniqueID なし VstInt32 iD エフェクターのユニークIDを設定する。サンプルエフェクターではMY_VST_UNIQUE_ID(宣言部で定義済み。2)としている。 isSynth なし bool state 作成するVSTがシンセかどうかを設定する。今回はエフェクターなのでfalseとしている。 canProcessReplacing なし bool state 32ビット浮動小数点で音声処理できるか設定する。サンプルエフェクターでは32ビット浮動小数点で音声処理を行うのでtrueとしている 上記関数を呼び出した後、作成するVST固有の変数初期化やバッファの確保等を行う。 サンプルエフェクターでは各パラメーターの変数にエフェクターのデフォルトの値を代入している。(21~25行目) VSTの終了処理 VSTの終了処理はデストラクタで行わなければならない。 サンプルエフェクターでは特に何もしていないが、コンストラクタで確保したメモリを開放したりする。 MyTremoloVST ~MyTremoloVST (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。} 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/60.html
VST Tips(準備中) vstplug.defの作成 DLLのエントリーポイントを記載した定義ファイル(.def)を作成する。 このファイルがない場合、コンパイルエラーとなり、DLLが生成できない。 vstplug.defファイルの作成 メモ帳を起動し、以下の内容を入力する。 EXPORTS VSTPluginMain main=VSTPluginMain 入力後、メモ帳のメニューから「ファイル」→「名前をつけて保存」を選択する。 作成したプロジェクトの「.sln」があるフォルダへ移動し、「vstplug.def」と名前をつけ「保存」を押す。 拡張子が「.def」となったファイルが作成されていれば完了。 .defファイルをプロジェクトへ追加 VC++でプロジェクトプロパティダイアログを開き、左側から「構成プロパティ」→「リンカ」→「入力」を選択。 ダイアログの右側「モジュール定義ファイル」に「../vstplug.def」を入力し「OK」を押す。 詳細な手順は次項で説明。 次へ 同一カテゴリのTips 項目 No. 概要 VC++ プロジェクトの準備 No.1 VC++でVST用のプロジェクトを作成する No.2 VSTを作成するに当たって必要なVST SDKファイルをVC++のプロジェクトに追加する No.3 VSTを作成するに当たって必要なvstplug.defファイルを作成する No.4 VSTを作成するに当たって必要なコンパイラ、リンカ設定を追加する No.5 VSTをコンパイルするの際の注意事項
https://w.atwiki.jp/vstplugins/pages/11.html
KONTAKT 2 定番のソフトサンプラー。幅広い対応フォーマットで、Halionとともに高い人気を誇る。 MIDIA (日本輸入元) Native-Instruments (開発元) ソフトウェア バージョン履歴 2.1.1 公開日 2006/06/01 主な特徴 15GB以上の膨大で即戦力のプロフェッショナル・サンプル・ライブラリーを標準装備 ダイナミックなリソース・アロケーションを備えた高性能なオーディオ・エンジン 192KHz、32ビットの高解像度サンプル・エンジン 制限のない同時発音数と64レイヤー可能なマルチ・ティンバー リアルタイムのグラニュラー・タイム・ストレッチングおよびリシンセシス 5種のサンプル・モード:クラシック、トーン、タイム・マシン1 2,ビート・マシン 広範囲にわたるモジュレーション機能とそれらのグラフィック表示 フィルタやモジュレーター、グループ・エディタ、マッピング・エディタやループ・エディタにより、ゾーンやスライシング・ループを簡単に操作可能 スライス・インフォメーションを含む「REX」「Apple Loops」ファイルをサポート テンポに同期した独特なステップ・シーケンサー、LFO、マルチステージ・エンベロープ 8つのループ・ポイントをサポートしたループ・エディターを搭載 リリース・トリガー、キー・スイッチ対応およびVSTオートメーション対応 インパルス・レスポンス・エフェクトで得られる限りなく本物に近い残響音 EQ、ディレイ、リバーブ、ウェーブシェイパーなど30以上のフィルターとエフェクトを搭載 ユニバーサル・インポート (約30種のサンプル、ライブラリー・フォーマッ トとの互換性) DFD(Direct From Disc)機能によりハードディスク・ストリーミング機能をサポート RAMセイビング・サンプルパージ機能 (RAMの節約機能) マルチプル・アンドゥ/リドゥ (アンドゥの記録保持 ヒストリー対応) マッピングとループ・エディターのウィンドウを単独で開くことが可能(スタンド・アローン時) キーボード・ショートカット対応 (作業の効率化) マスター・セクション (グローバル・テンポ・セッティング、マスター・チューンとチューニング・トーン、メトロノーム) キーボードによるトグルのオン/オフ機能 最大16チャンネルのミックスが可能な、高度なサラウンド・サウンド機能 KONTAKTスクリプト・プロセッサー(KSP)によりエンジンや機能をカスタマイズ可能 ドラッグ&ドロップによる簡便なサンプル管理 直感的な操作感を提供する最新ユーザー・インターフェースと数々の画期的な機能を搭載 フレキシブルなモジュール・アーキテクチャーで、欲しいサウンドを簡単に得ることが可能 高性能ブラウザ機能により基本情報を簡潔に表示 マルチプロセッサー対応 (Mac OS:G4/G5 Dual, Windows:SSE) スタンドアローンまたはプラグインとして動作可能 対応サンプル・フォーマット GigaStudio, Akai S-1000/S-3000/S-5000/S-6000/MPC/MESA, EXS24, HALion, AIFF, WAV, .S, .SND, Emu EOS/E4B, EMU E3/ESi, SoundFont2, REX I II, ACID, Apple Loops, Roland S-5x/S-7x, MachFive, Reason NN-XT, LM4, LM4-mkII, SDII(Mac), Unity, Pulsar+STS, Ensoniq EPS/ASR, Kurzweil, Reaktor Map, KOMPAKT, INTAKT, KONTAKT 1.x, BATTERY 1 2 対応プラグイン・フォーマット ■Windows XP: VST2.0/ DXi/ RTAS および「スタンドアロン」単体動作 (オーディオドライバ=ASIO/DirectSound) ■Mac OS X: AudioUnits/ VST2.0/ RTAS および「スタンドアロン」単体動作 (オーディオドライバ=Core Audio/ASIO) 名前 コメント